class RouterConfig {
  _params(data) {
    let params = ''
    if (data) {
      params = '?' + (Object.keys(data).map((key) => {
        return encodeURIComponent(key) + '=' + encodeURIComponent(data[key])
      }).join('&'))
    }
    return params
  }

  /**
   * 路由跳转配置
   * @param method
   * @param url
   * @param data
   * @returns {Promise<unknown>}
   * @private
   */
  _config(method, url, data) {
    return new Promise((resolve, reject) => {
      uni[method]({
        url: url + this._params(data),
        success: () => {
          resolve()
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  }
}

class Router extends RouterConfig {
  // constructor() { super() }

  /**
   * 前往页面
   * @param{string} url
   * @param{object} data
   * @returns {Promise<unknown>}
   */
  push(url, data = '') {
    return this._config('navigateTo', url, data)
  }

  /**
   * 返回
   * @param{number} index
   */
  back(index = 1) {
    uni.navigateBack({
      delta: index
    })
  }

  /**
   * 关闭当前页面跳转
   * @param{string} url
   * @param{object} data
   * @returns {Promise<unknown>}
   */
  replace(url, data) {
    return this._config('redirectTo', url, data)
  }

  /**
   * 关闭所有页面 前往某一页面
   * @param{string} url
   * @param{object} data
   * @returns {Promise<unknown>}
   */
  reLaunch(url, data) {
    return this._config('reLaunch', url, data)
  }

  /**
   * 前往tabBar页面
   * @param url
   * @returns {Promise<unknown>}
   */
  goTabBar(url) {
    return this._config('switchTab', url)
  }

  /**
   * 获取路由参数
   * @returns {Record<string, string | undefined> | *}
   */
  query() {
    // eslint-disable-next-line no-undef
    const pages = getCurrentPages() // 只有在微信 || H5才有此方法
    const curPage = pages[pages.length - 1]
    return curPage.options || curPage.$route.query
  }
}
const $router = new Router()
export default $router
